package designpatterns.structure;

/**
 * 代理模式(编译期就已经确定代理类和真实类的关系)
 * 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。
 * 优点：代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用；
 *      代理对象可以扩展目标对象的功能；
 *      代理模式能将客户端与目标对象分离，在一定程度上降低了系统的耦合度；
 * 缺点：在客户端和目标对象之间增加一个代理对象，会造成请求处理速度变慢；
 * 增加了系统的复杂度
 *
 * @author jack.wu
 * @since 2019/9/19
 */
public class ProxyTest {

    public static void main(String[] args) {

        ProxySubject proxy = new ProxySubject();
        proxy.request();

    }

}

/**
 * 抽象主题
 */
interface Subject {

    /**
     * 请求
     */
    void request();
}

/**
 * 真实主题
 */
class RealSubject implements Subject {

    @Override
    public void request() {
        System.out.println("请求真实主题。。。");
    }
}

/**
 * 代理主题
 */
class ProxySubject implements Subject {

    private RealSubject realSubject;

    @Override
    public void request() {
        if (realSubject == null) {
            realSubject = new RealSubject();
        }
        preRequest();
        realSubject.request();
        postRequest();
    }

    private void preRequest() {
        System.out.println("目标对象处理之前。。。");
    }

    private void postRequest() {
        System.out.println("目标对象处理之后。。。");
    }
}
